7070
19888
這個問題已經在這裡有了答案:
重載運算符中沒有隱式轉換
(2個答案)
7年前關閉。
我正在為基本類型編寫一個簡單的包裝程序,並試圖避免不得不編寫太多標準操作符。我希望隱式類型轉換會有所幫助,但沒有幫助。這是一個簡化的示例:
struct Int
{
int _i;
Int(int i = 0):_i {i} {}
Int運算符+(const Int&rhs){返回_i + rhs._i;}
};
int main(int argc,char * argv [])
{
(無效)(Int(1)+ 2); // 美好的
(無效)(2 + Int(1)); //錯誤:對二進製表達式無效的操作數(“ int”和“ Int”)
}
我正在使用llvm。第一行主要編譯良好。第二個導致錯誤。現在,我希望在第二行中發生的是將2隱式轉換為Int(2),然後再調用operator +。為什麼不發生這種情況?為什麼第一行會發生隱式轉換? 
它發生在第一行,因為唯一可用的operator +是operator +(Int&)(對於此實例,它具有隱式的Int第一參數)。第二行失敗,因為第一個參數是int,並且不知道在嘗試操作之前需要對其進行轉換(它不知道需要使用Int :: operator +)。
您可以通過使操作員成為非成員朋友功能來避免該問題(http://ideone.com/YCf7wX)
struct Int
{
int _i;
Int(int i = 0):_i {i} {}
朋友Int運算符+(const Int&lhs,const Int&rhs);
};
Int運算符+(const Int&lhs,const Int&rhs)
{
返回lhs._i + rhs._i;
}
int main()
{
詮釋
我+ 5;
5 +我;
返回0;
}
|
不是您要找的答案?瀏覽標記為c ++運算符關鍵字隱式轉換的其他問題,或者提出您自己的問題。